#lang scheme

(define % remainder)
(define // quotient)


(define (pow a b)                        ; a ^ b
  (if ( = b 0) 1 (* a (pow a (- b 1)))))

(define (z1 x k)
  (cons (// x (pow 10 k))                ; убираем k правых цифр 
        (% x (pow 10 k))))               ; оставляем первые (справа) k цифр
;------------------------------------------------------------------

(define (z2 lst)
  (if (null? lst)           ; база
      #t
      (if (even? (car lst)) ; проверка на четность
          (z2 (cdr lst))
          #f
)))


;----------------------------------------------------------------

(define (z3 lst)
  (define (iter pre cur lst)                      ; pre - предыдущий, cur - текущий и lst - список
    (if (empty? lst)
        cur
        (if (and (<= pre cur) (>= cur (car lst))) ; проверяем, что нет соседних элементов превосходящих текущий
            cur
            (iter cur (car lst) (cdr lst)))))     ; продолжаем
  
  (if (empty? (cdr lst))                          ; если одноэлементный список, вывести его элемент
      (car lst)
      (iter (car lst) (car lst) (cdr lst))))      ; записываем первый элемент lst в pre и в cur


;----------------------------------------------------------------
(define (z4 lst)
 (define (iter foo arr)                        ; передаем два списка  
   (if (empty? foo)                            ; база
       arr                                     ; выводим результат 
       (iter (cdr foo) (cons (car foo) arr)))) ; добавляем в начало arr элемент из lst, таким образом переворачиваем lst
  (if (empty? lst)                             ; если изначальный список пуст
      null
      (iter lst (cdr lst))))                   ; убираем первый элемент, предупреждая дублирование a(1) элемента

;---------------------------------------------------------------------
(define (counter x)               ; считает кол-во разрядов числа
  (if (< x 10)
      1
      (+ 1 (counter (// x 10)))))

(define (z5 n lst)
  (define (iter lst res)
    (if (empty? lst)
        res
        (if (<= (counter (car lst)) n)              ; "...кол-во разрядов не более заданного на входе"
            (if (= res 0)
                (iter (cdr lst) (car lst))          ; заменяем ноль на первое число списка
                (iter (cdr lst) (* res (car lst)))) ; умножаем res на элемент списка
            (iter (cdr lst) res))))                 ; пробегаем дальше по списку сохраняя res 
  (iter lst 0))
          
          
        
 
  



















  